package org.aerie.forest.extensions.base.rebar.bootable;

import java.time.LocalDateTime;

import org.aerie.forest.core.frame.rebar.entity.bootable.ForestBootable;

/**
 * @description 时间晶振
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月27日 下午5:31:34
 * @version 1.2.0
 */
public final class TimeCrystal extends ForestBootable {

	/**
	 * @description 时间 刷新频率【1秒刷新下一次】
	 * 
	 * @author quark
	 * @date 2020年2月27日 下午5:32:03
	 */
	private static final long timeFrequency = 1000;

	/**
	 * @description forest静态内部类单例
	 *
	 * @author quark
	 * @organization aerie
	 * @date 2020-7-9 20:30:37
	 * @version 2.0.1
	 */
	private static final class ForestInstance {

		/**
		 * @description 单例对象
		 * 
		 * @author quark
		 * @date 2020-7-9 21:16:25
		 * @version 2.0.1
		 */
		private static final TimeCrystal TIME_CRYSTAL = new TimeCrystal();
	}

	/**
	 * Construction
	 * 
	 * @param allowBootFlag 允许启动标识
	 *
	 * @date 2020年2月27日 下午5:32:49
	 */
	private TimeCrystal() {
		super(true, "时间晶振", new RunnableFunction() {

			@Override
			public void action() throws Exception {
				// 刷新时间
				// nano为0到9位的数，补全并取出倒数9到6位（共三位）数及为毫秒数
				String nano = "000000000" + LocalDateTime.now().getNano();
				// 获取时间的毫秒
				// 负反馈稳定时间晶振
				Thread.sleep(timeFrequency - Integer.valueOf(nano.substring(nano.length() - 9, nano.length() - 6)));
				LOGGER.trace("刷新系统时间");
			}
		});
		thread = new Thread(bootModule);
		LOGGER.info(LogMsgPool.INIT_COMPLETE, forestFrameName);
	}

	/**
	 * @description 获得单例时间晶振
	 * @return 时间晶振
	 *
	 * @date 2020年2月27日 下午5:38:47
	 */
	static TimeCrystal getInstance() {
		return ForestInstance.TIME_CRYSTAL;
	}

	/**
	 * @description 获得系统当前的时间
	 * @return 当前时间
	 *
	 * @date 2020年2月27日 下午5:39:19
	 */
	public LocalDateTime getSystemTime() {
		return LocalDateTime.now();
	}

	/**
	 * @description 处理异常
	 * @param exception 待处理的异常
	 *
	 * @date 2020年2月27日 下午5:39:30
	 */
	@Override
	protected void disposeException(Exception exception) {
//		ExceptionProcessor.INSTANCE.recordException("时间晶振中断", exception, new ExceptionDisposeFunction() {
//
//			@Override
//			public void action() {
//				// 设置中断标识
//				Thread.currentThread().interrupt();
//			}
//		});
	}

	/**
	 * @description 启动前动作
	 *
	 * @date 2020年2月27日 下午5:40:18
	 */
	@Override
	protected void beforeRun() {
		// Do Nothing
	}

	/**
	 * @description 启动后动作
	 *
	 * @date 2020年2月27日 下午5:40:55
	 */
	@Override
	protected void afterRun() {
		// Do Nothing
	}

}
